package com.ruoyi.system.service.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.persistence.criteria.Predicate;
import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.dao.service.BaseAppDAO;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.dao.SysPostDAO;
import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.service.ISysPostService;

/**
 * 岗位信息 服务层处理
 * 
 * @author ruoyi
 */
@Service
public class SysPostServiceImpl implements ISysPostService
{
	
	@Autowired
    private BaseAppDAO baseDAO;
	
    @Autowired
    private SysPostDAO postDAO;

    /**
     * 查询岗位信息集合
     * 
     * @param post 岗位信息
     * @return 岗位信息集合
     */
    @Override
    public List<SysPost> selectPostList(SysPost post)
    {
    	Specification<SysPost> specification = (root, criteriaQuery, criteriaBuilder) -> {
			List<Predicate> predicateList = new ArrayList<>();
			
			if (!StringUtils.isEmpty(post.getPostCode())) {
				predicateList.add(criteriaBuilder.like(root.get("postCode"), "%"+post.getPostCode()+"%"));
			}
			if (!StringUtils.isNull(post.getStatus())) {
				predicateList.add(criteriaBuilder.equal(root.get("status"),post.getStatus()));
			}
			
			
			if (!StringUtils.isEmpty(post.getPostName())) {
				predicateList.add(criteriaBuilder.like(root.get("postName"),"%"+post.getPostName()+"%" ));
			}
			
			
			Predicate[] p = new Predicate[predicateList.size()];
			return criteriaBuilder.and(predicateList.toArray(p));
		};
		
		
        return postDAO.findAll(specification);
    }

    /**
     * 查询所有岗位
     * 
     * @return 岗位列表
     */
    @Transactional
    @Override
    public List<SysPost> selectPostAll()
    {
        return postDAO.findAll();
    }

    /**
     * 通过岗位ID查询岗位信息
     * 
     * @param postId 岗位ID
     * @return 角色对象信息
     */
    @Override
    public SysPost selectPostById(String postId)
    {
        return postDAO.findById(postId).orElse(null);
    }


    /**
     * 校验岗位名称是否唯一
     * 
     * @param post 岗位信息
     * @return 结果
     */
    @Override
    public String checkPostNameUnique(SysPost post)
    {
        String postId = StringUtils.isNull(post.getPostId()) ? "" : post.getPostId();
        SysPost info = postDAO.findTop1ByPostName(post.getPostName());
        if (StringUtils.isNotNull(info) && !info.getPostId().equals(postId))
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 校验岗位编码是否唯一
     * 
     * @param post 岗位信息
     * @return 结果
     */
    @Override
    public String checkPostCodeUnique(SysPost post)
    {
        String postId = StringUtils.isNull(post.getPostId()) ? "" : post.getPostId();
        SysPost info = postDAO.findTop1ByPostCode(post.getPostCode());
        if (StringUtils.isNotNull(info) && !info.getPostId().equals(postId))
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 删除岗位信息
     * 
     * @param postId 岗位ID
     * @return 结果
     */
    @Transactional
    @Override
    public int deletePostById(String postId)
    {
    	postDAO.deleteById(postId);
        return 1;
    }

    /**
     * 批量删除岗位信息
     * 
     * @param postIds 需要删除的岗位ID
     * @return 结果
     */
    @Transactional
    @Override
    public int deletePostByIds(String[] postIds)
    {
        for (String postId : postIds)
        {
            //TODO 删除前应该做一些校验
//            SysPost post = selectPostById(postId);
//            if (countUserPostById(postId) > 0)
//            {
//                throw new ServiceException(String.format("%1$s已分配,不能删除", post.getPostName()));
//            }
        }
        postDAO.deleteAllByIdInBatch(Arrays.asList(postIds));
        return 1;
    }

    /**
     * 新增保存岗位信息
     * 
     * @param post 岗位信息
     * @return 结果
     */
    @Transactional
    @Override
    public SysPost insertPost(SysPost post)
    {

        return postDAO.save(post);
    }

    /**
     * 修改保存岗位信息
     * 
     * @param post 岗位信息
     * @return 结果
     */
    @Transactional
    @Override
    public SysPost updatePost(SysPost post)
    {

        return postDAO.save(post);
    }

	@Override
	public List<SysPost> selectPostsByUserName(String userName) {
		String querysql = "select p.post_id, p.post_name, p.post_code from sys_post p "
				+ " left join sys_user_post up on up.post_id = p.post_id "
				+ " left join sys_user u on u.user_id = up.user_id"
				+ "  where u.user_name = '"+userName+"'";
		return baseDAO.createNativeQuery(querysql,SysPost.class);
	}
}
